//按需导入操作token的函数
import { login, getUserInfo, getUserDetailInfo } from '@/api/user'
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
// 状态
const state = {
  userInfo: null,
  token: getToken(), //设置token初始状态 token持久化 => 放到缓存中
}
// 修改状态 提供修改token的mutations
const mutations = {
  //设置token
  setToken(state, token) {
    state.token = token //设置token 只是修改state的数据 123=》1234
    //vuex变化 =》缓存数据
    setToken(token) //vuex和缓存数据的同步
  },
  //删除缓存
  removeToken(state) {
    state.token = null //清除vuex中的token数据
    removeToken() //先清除vuex中的token数据，再清除缓存中的数据
  },
  //设置用户资料
  setUserInfo(state, result) {
    state.userInfo = result
  },
  //删除用户资料
  removeUserInfo(state) {
    state.userInfo = null
  },
}
// 执行异步
const actions = {
  // 定义login action 也需要参数 调用action时，传递过来的参数
  async login(cxt, data) {
    //经过响应拦截器的处理之后，这里的result实际就是token
    const result = await login(data)
    //如果能进到这里说明请求和业务都没有出错，所以不需要在此页面判断了
    //axios默认给数据加了一层data
    //actions 修改state 必须通过mutations
    cxt.commit('setToken', result)
    setTimeStamp() //能进到这里说明表单验证和后台校验都没有问题,所以在这里设置时间戳
  },
  //获取用户资料action
  async getUserInfo(cxt) {
    const normalInfo = await getUserInfo() //获取返回值
    const detailInfo = await getUserDetailInfo(normalInfo.userId) //获取用户详细信息
    const userInfo = { normalInfo, detailInfo }
    cxt.commit('setUserInfo', userInfo) //将数据传入至setUserInfo方法中，通过mutations模块修改state中的数据
    return userInfo
  },
  //退出登录的action
  logout(cxt) {
    cxt.commit('removeUserInfo')
    cxt.commit('removeToken')
  },
}
export default {
  namespaced: true,
  state,
  mutations,
  actions,
}
